package com.young.core.dao.impl;

import com.young.core.dao.BaseDao;
import com.young.core.dao.LockDao;
import com.young.core.domain.LockDO;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @description：
 * @author: yangyahui01
 * @date: 11/28/24 2:51 PM
 */
@Component
public class LockDaoImpl extends BaseDao implements LockDao {
    /**
     * 根据namespace获取Lock
     *
     * @param namespace
     * @return
     */
    @Override
    public LockDO get(String namespace) {

        Map<String,Object> parameter = new HashMap<>();
        parameter.put("namespace", namespace);
        return this.sqlSession.selectOne("LockMapper.getByNamespace", parameter);
    }

    /**
     * 保持活性，ttl表示续约市场，考虑到DB时钟可能与Broker节点时钟不同，所以需要将ttl传入
     *
     * @param namespace
     * @param owner
     * @param ttl
     * @return
     */
    @Override
    public boolean keepAlive(String namespace, String owner, int ttl) {
        Map<String, Object> parameter = new HashMap<>();
        parameter.put("namespace", namespace);
        parameter.put("owner", owner);
        parameter.put("ttl",ttl);
        int rn = this.sqlSession.update("LockMapper.keepAlive", parameter);
        return rn > 0;
    }

    /**
     * 尝试加锁，如果加锁成功则返回true
     *
     * @param namespace
     * @param owner
     * @param version
     * @return
     */
    @Override
    public boolean lock(String namespace, String owner, long version) {
        Map<String, Object> parameter = new HashMap<>();
        parameter.put("namespace", namespace);
        parameter.put("owner", owner);
        if (version > 0) {
            parameter.put("version", version);
        }
        int rn = this.sqlSession.update("LockMapper.lock", parameter);
        return rn > 0;
    }

    @Override
    public boolean unlock(String namespace, String owner) {
        Map<String, Object> parameter = new HashMap<>();
        parameter.put("namespace", namespace);
        parameter.put("owner", owner);
        int rn = this.sqlSession.update("LockMapper.unlock",parameter);
        return rn > 0;
    }

    @Override
    public void insert(String namespace) {
        this.sqlSession.insert("LockMapper.insert",namespace);
    }
}
